
package im.agents.slachecker;

import im.domain.SLA;
import im.domain.XMLSerializer;
import jade.content.ContentElement;
import jade.content.lang.Codec.CodecException;
import jade.content.onto.OntologyException;
import jade.content.onto.UngroundedException;
import jade.core.AID;
import jade.core.Agent;
import jade.domain.FIPAAgentManagement.*;
import jade.domain.FIPANames.InteractionProtocol;
import jade.lang.acl.*;
import jade.proto.ProposeResponder;

/**
 * Implementa il protocollo <tt>FIPA PROPOSAL</tt>.
 * Risponde alla proposta di un agente di sottscrivere un SLA con un altro agente, 
 * che fornisca il servizio indicato nel content del messaggio, rispettando 
 * i parametri richiesti.
 * 
 * @author Savino
 * @see im.agents.users.SLAProposeInitiator
 *
 */
public class SLAProposeResponder extends ProposeResponder {

	private MessageTemplate mt;
	private AID user;
	private String convId;
	public SLAProposeResponder(Agent a, MessageTemplate mt) {
		super(a, mt);
		this.mt=mt;
	}
	
	/**
	 * Prepara il messaggio di risposta: accetta la proposta (<tt>ACCEPT-PROPOSAL</tt>),
	 * e lancia sull'agente un'istanza di <b><tt>NegotiateSLAInitiator</tt></b>.
	 * 
	 * @see im.agents.slachecker.NegotiateSLAInitiator
	 */
	protected ACLMessage prepareResponse(ACLMessage propose)
		throws NotUnderstoodException, RefuseException{
		ACLMessage reply = propose.createReply();
		user = propose.getSender();
		convId=propose.getConversationId();
		switch(propose.getPerformative()){
		case ACLMessage.PROPOSE:{
			SLA sla = (SLA)XMLSerializer.doDeserialize(propose.getContent());
			
			//System.out.println(myAgent.getLocalName()+" - received PROPOSE - "+sla.getServizio());
			reply.setPerformative(ACLMessage.ACCEPT_PROPOSAL);
			ACLMessage msg = new ACLMessage(ACLMessage.CFP);
			msg.setConversationId(convId);
			msg.setProtocol(InteractionProtocol.FIPA_CONTRACT_NET);
			
			myAgent.addBehaviour(new NegotiateSLAInitiator(
					myAgent,msg, sla, user));
			break;
		}
		default:
			reply.setPerformative(ACLMessage.NOT_UNDERSTOOD);
			break;
		}
		
		
		
		return reply;
		
	}
	
	public int onEnd(){
		reset();
		return 0;
	}
	
}
